﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Triunfadores.Repository.Service;
using Triunfadores.BusinessEntities;

namespace Triunfadores.Repository
{
    public class SolicitudPrestamoRepository:MasterRepository,ISolicitudPrestamoRepository
    {
        public IEnumerable<SolicitudPrestamo> ObtenerTodasLasSolicitudesDePrestamosPorCriterioTipoClienteYFechas(
            string criterio, int? idTipoCliente, DateTime? fechInicial, DateTime? fechFinal)
        {
            #region Primero
            //obtengo todos las solicitudes de prestamos
            var query = (from sp in Context.SolicitudPrestamos
                        .Include("Cliente")
                        orderby sp.FechSolicitud descending
                        select sp).Take(100);

            //filtro por nombre
            if (!string.IsNullOrEmpty(criterio))
            {
                query = (from sp in query
                        where sp.Cliente.Nombres.ToUpper().Contains(criterio.ToUpper())
                        orderby sp.FechSolicitud descending
                        select sp).Take(50);
            }

            //filtro por rango de fechas ingresado
            if (fechInicial.HasValue && fechFinal.HasValue)
            {
                fechInicial = DateTime.Parse(fechInicial.Value.ToShortDateString() + " 00:00:00");
                fechFinal = DateTime.Parse(fechFinal.Value.ToShortDateString() + " 23:59:59");

                query = (from sp in query
                        where sp.FechSolicitud >= fechInicial && sp.FechSolicitud<= fechFinal
                        orderby sp.FechSolicitud descending
                        select sp).Take(50);
            }
            #endregion

            if (idTipoCliente >= 1)
            {

                if (fechInicial.HasValue && fechFinal.HasValue)
                {

                    fechInicial = DateTime.Parse(fechInicial.Value.ToShortDateString() + " 00:00:00");
                    fechFinal = DateTime.Parse(fechFinal.Value.ToShortDateString() + " 23:59:59");

                    query = (from sp in query
                            where sp.FechSolicitud >= fechInicial && sp.FechSolicitud <= fechFinal && sp.Cliente.IdTipoCliente == idTipoCliente
                            orderby sp.FechSolicitud descending
                            select sp).Take(50);
                }

                query = (from sp in query
                        where sp.Cliente.IdTipoCliente == idTipoCliente
                        orderby sp.FechSolicitud descending
                        select sp).Take(50);

            }

            return query.ToList();
        }

        public SolicitudPrestamo ObtenerSolicitudPrestamoPorId(int id)
        {
            //return Context.SolicitudPrestamos.Find(id);
            return Context.SolicitudPrestamos.Where(sp => sp.Id == id)
                         .Include(sp => sp.Cliente)
                         .SingleOrDefault();
        }

        public void AddSolicitudPrestamo(SolicitudPrestamo solicitudPrestamo)
        {
            Context.SolicitudPrestamos.Add(solicitudPrestamo);
            Context.SaveChanges();
        }

        public void UpdateSolicitudPrestamo(SolicitudPrestamo solicitudPrestamo)
        {
            Context.Entry(solicitudPrestamo).State=EntityState.Modified;
            Context.SaveChanges();
        }

        public void DeleteSolicitudPrestamo(int id)
        {
            throw new NotImplementedException();
        }


        public IEnumerable<SolicitudPrestamo> ObtenerTodasLasSolicitudesPrestamo()
        {
            var query = from sp in Context.SolicitudPrestamos
                select sp;

            return query.ToList();
        }


        public SolicitudPrestamo ObtenerSolicitudPrestamoPorIdCliente(int idCliente)
        {
            //return context.Groups.Where(c => c.GroupID == id)
            //             .Include(a => a.UserGroups)
            //             .Include(a2 => a2.SecurityRoles)
            //             .SingleOrDefault();
            return Context.SolicitudPrestamos.SingleOrDefault(sp => sp.IdCliente == idCliente);



        }
    }
}
